前面我們提到 Dockerfile 是將「環境與服務設定」寫成文字檔,來建構 image 並運行 container。但實際上,單一服務往往不夠,例如:
如果這兩個 container 彼此無法透過網路連線,那即使都成功啟動,也完全無法對外提供服務。因此,Docker 官方推薦使用 Docker Compose,這是一個可以定義多個服務(containers)間如何協作的工具。
Docker Compose 現在被改為 Docker CLI 的 plugin,所以需透過套件管理工具安裝:
sudo yum install docker-compose-plugin
安裝完成後,可透過以下指令檢查是否成功:
docker compose version
在專案根目錄中建立一個設定檔:
touch docker-compose.yml
services: # 定義多個 container 組成的服務群
nginx: # 第一個服務:Nginx
image: nginx:mainline-alpine # 使用官方輕量 Nginx image
ports:
- "${NGINX_PORT:-8080}:8080" # 對外映射:主機:容器
volumes:
- ./environmentConfig/nginx.conf:/etc/nginx/nginx.conf # 覆蓋 Nginx 設定檔
networks:
- backend-local # 加入內部自訂的 bridge 網路
depends_on:
- php # 等待 php container 啟動後再啟動 nginx
php: # 第二個服務:PHP (Laravel 專案)
image: "${IMAGE_NAME:-demo-php}" # 支援 .env 設定 image 名稱
build: # 若 image 尚未存在,從 Dockerfile 建立
context: ./ # Dockerfile 所在目錄(. 是當前目錄)
dockerfile: Dockerfile
args:
- APP_ENV=${APP_ENV} # 傳入建構參數(來自 .env)
volumes:
- ./environmentConfig/php.ini:/usr/local/etc/php/conf.d/local.ini
- ./environmentConfig/www.conf:/usr/local/etc/php-fpm.d/www.conf
- ./:/www # 專案資料夾掛載進 container 的 /www
- /www/vendor
- /www/bootstrap/cache
extra_hosts:
- "host.docker.internal:host-gateway"
# 讓 container 可透過 host.docker.internal 訪問主機 IP(Linux 上需加這行)
expose:
- "9003"
# 開放給同網段容器使用的 port(但不對外公開)
networks:
- backend-local
networks:
backend-local:
driver: bridge # 使用 bridge 模式建立內部虛擬網路
docker compose up -d --build